// Original script is 'Post-Build script to fix MSI issues in Vista for VS 2005 Setup and Deployment Projects' by Nikhil's Blog.
// http://blogs.msdn.com/nikhiln/default.aspx

// PostBuildVistaFix.js <msi-file> 
// Performs a post-build fixup of an msi to change all deferred custom actions to NoImpersonate and adds an entry in the error table
// Constant values from Windows Installer 

var msiOpenDatabaseModeTransact = 1;
var msiViewModifyInsert = 1
var msiViewModifyUpdate = 2
var msiViewModifyAssign = 3
var msiViewModifyReplace = 4
var msiViewModifyDelete = 6

var msidbCustomActionTypeInScript = 0x00000400;
var msidbCustomActionTypeNoImpersonate = 0x00000800;

if (WScript.Arguments.Length != 1)
{
    WScript.StdErr.WriteLine(WScript.ScriptName + " filename.msi");
    WScript.Quit(1);
}

var filespec = WScript.Arguments(0);
var installer = WScript.CreateObject("WindowsInstaller.Installer");
var database = installer.OpenDatabase(filespec, msiOpenDatabaseModeTransact);

var sql
var view
var record
var errorRecordFound = false;

try
{
    // clear the NO_IMPERSONATE bit for all the custom actionss
    sql = "SELECT `Action`, `Type`, `Source`, `Target` FROM `CustomAction`";
    view = database.OpenView(sql);
    view.Execute();
    record = view.Fetch();


    while (record)
    {
        if (record.IntegerData(2) & msidbCustomActionTypeInScript)
        {
            record.IntegerData(2) = record.IntegerData(2) - msidbCustomActionTypeNoImpersonate;
            view.Modify(msiViewModifyReplace, record);
        }
        record = view.Fetch();
    }

    // close the view.
    view.Close();

    database.Commit();

    WScript.StdOut.WriteLine("MSI updated!");
    
}
catch(e)
{
    WScript.StdErr.WriteLine(e);
    WScript.Quit(1);
}
